package br.com.eSink.connection;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import android.os.Environment;
import br.com.eSink.util.Logging;

public class Sharing {

	/*
	 * CAMINHO[0] = MUSICA CAMINHO[1] = VIDEO CAMINHO[2] = IMAGENS
	 */
	//private static String[] path = { "/sdcard/media/music",
			//"/sdcard/media/video", "/sdcard/media/image" };

	public static void sendFile(Socket skt, File file) {

		// COLOCA DADOS DO ARQUIVO EM UM BYTE[]
		byte[] mybytearray = new byte[(int) file.length()];
		FileInputStream fis;
		try {
			// ATRIBUI AO STREAM DE ENTRADA DE ARQUIVO O ARQUIVO
			fis = new FileInputStream(file);
			// CRIA UM STREAM DE ENTRADA EM BUFFER
			BufferedInputStream bis = new BufferedInputStream(fis);
			// CRIA UM STREAM DE ENTRADA DE DADOS
			DataInputStream dis = new DataInputStream(bis);
			// LE O ARRAY QUE CORRESPONDE AO ARQUIVO
			dis.readFully(mybytearray, 0, mybytearray.length);
			// RECEBE O STREAM DE SA�DA DO SOCKET
			OutputStream os = skt.getOutputStream();
			// CRIA UM STREAM DE SA�DA DE DADOS
			DataOutputStream dos = new DataOutputStream(os);
			// ENVIA O NOME DO ARQUIVO
			dos.writeUTF(file.getName());
			// ENVIA O TAMANHO DO ARQUIVO
			dos.writeLong(mybytearray.length);
			// ENVIA O BYTE[] DO ARQUIVO
			dos.write(mybytearray, 0, mybytearray.length);

			// DESCARREGA O STREAM
			dos.flush();
			// FECHA O STREAM
			dos.close();
		} catch (FileNotFoundException ex) {
			System.out.println(ex.getMessage());
		} catch (IOException ex) {
			System.out.println(ex.getMessage());
		}
	}

	// RECEBE ARQUIVO VIA SOCKET E ARMAZENA ARQUIVO NA PASTA SELECIONADA
	public static File requestFile(Socket skt, String caminho) {

		int bytesRead;
		InputStream in;

		try {
			// RECEBE INPUTSREAM DO SOCKET
			in = skt.getInputStream();
			// RECEBE INPUTSTREAM DE DADOS
			DataInputStream clientData = new DataInputStream(in);
			// RECEBE NOME DO ARQUIVO
			String fileName = clientData.readUTF();
			// CRIA ARQUIVO COM O CAMINHO PEDIDO E SEGUIDO DE NOME
			File file = new File(caminho + "/" + fileName);
			// CRIA UM OUTPUTSTREAM COM ESTE ARQUIVO
			OutputStream output = new FileOutputStream(file);
			// RECEBE TAMANHO DO ARQUIVO
			long size = clientData.readLong();
			// CRIA BUFFER PARA ARMAZENAR BYTES QUE S�O RECEBIDOS EM BLOCOS DE 1
			// MB
			byte[] buffer = new byte[1024];
			// RECEBE OS BLOCOS DO ARQUIVO E GRAVA DE 1 MB EM 1 MB
			
			while (size > 0
					&& (bytesRead = clientData.read(buffer, 0,
							(int) Math.min(buffer.length, size))) != -1) {
				output.write(buffer, 0, bytesRead);
				size -= bytesRead;
			}
			// DESCARREGA INFORMA��O
			output.flush();
			// FECHA OUTPUT
			output.close();
			// RETORNA ARQUIVO COMPLETO
			return file;
		} catch (IOException ex) {
			System.out.println("oi");
		}
		return null;
	}

	// RECEBE ARQUIVO VIA SOCKET E ARMAZENA ARQUIVO EM PASTA PADR�O
	public static File requestFile(Socket skt) {

		int bytesRead;
		InputStream in;

		try {
			// RECEBE INPUTSREAM DO SOCKET
			in = skt.getInputStream();
			// RECEBE INPUTSTREAM DE DADOS
			DataInputStream clientData = new DataInputStream(in);
			// RECEBE NOME DO ARQUIVO
			String fileName = clientData.readUTF();
			// CRIA ARQUIVO COM O CAMINHO PADRAO E SEGUIDO DE NOME
			File file = null;
			
			Logging.write("Criando Arquivo", true);
			if (fileName.endsWith("mp3") || fileName.endsWith("wma")
					|| fileName.endsWith("m4a") || fileName.endsWith("MP3")
					|| fileName.endsWith("WMA") || fileName.endsWith("M4A")) {
				Logging.write("Criando arquivo de música", true);
				file = new File(Environment.getExternalStorageDirectory() + "/" + fileName);
			} else {
				if (fileName.endsWith("mp4") || fileName.endsWith("wmv")
						|| fileName.endsWith("avi") || fileName.endsWith("MP4")
						|| fileName.endsWith("WMV") || fileName.endsWith("AVI")) {
					file = new File(Environment.DIRECTORY_MOVIES + "/" + fileName);
				} else {
					if (fileName.endsWith("jpg") || fileName.endsWith("png")
							|| fileName.endsWith("gif")
							|| fileName.endsWith("JPG")
							|| fileName.endsWith("PNG")
							|| fileName.endsWith("GIF")) {
						file = new File(Environment.DIRECTORY_PICTURES + "/" + fileName);
					}
				}
			}
			// CRIA UM OUTPUTSTREAM COM ESTE ARQUIVO
			OutputStream output = new FileOutputStream(file);
			// RECEBE TAMANHO DO ARQUIVO
			long size = clientData.readLong();
			// CRIA BUFFER PARA ARMAZENAR BYTES QUE S�O RECEBIDOS EM BLOCOS DE 1
			// MB
			byte[] buffer = new byte[1024];
			Logging.write("Preenchendo arquivo", true);
			// RECEBE OS BLOCOS DO ARQUIVO E GRAVA DE 1 MB EM 1 MB
			long startx = System.currentTimeMillis(); 
			while (size > 0
					&& (bytesRead = clientData.read(buffer, 0,
							(int) Math.min(buffer.length, size))) != -1) {
				output.write(buffer, 0, bytesRead);
				size -= bytesRead;
			}
			long finishx = System.currentTimeMillis();
			long totalx = finishx - startx;
			Logging.write("Musica: "+Long.toString(totalx), true);
			// DESCARREGA INFORMA��O
			output.flush();
			// FECHA OUTPUT
			return file;
		} catch (IOException ex) {
			System.out.println(ex.getMessage());
		}
		return null;
	}
	
    public static void sendQuantity(Socket skt, int num) {

        //COLOCA DADOS DO ARQUIVO EM UM BYTE[]

        Logging.write("Enviando quantidade de arquivos pelo método\n", true);
        try {

            OutputStream os = skt.getOutputStream();
            //CRIA UM STREAM DE SA�DA DE DADOS
            DataOutputStream dos = new DataOutputStream(os);
            //ENVIA A QUANTIDADE DE ARQUIVOS
            dos.writeInt(num);

            
            //DESCARREGA O STREAM
            dos.flush();
            //FECHA O STREAM
            dos.close();
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    public static int requestQuantity(Socket skt) {


		int bytesRead;
		InputStream in;
		int qtt = 0;
		try {
			// RECEBE INPUTSREAM DO SOCKET
			in = skt.getInputStream();
			// RECEBE INPUTSTREAM DE DADOS
			DataInputStream clientData = new DataInputStream(in);
			// RECEBE NOME DO ARQUIVO
			 qtt = clientData.readInt();
			return qtt;
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
		File path = new File(Environment.getExternalStorageDirectory()+"/Teste/" );
		path.mkdir();
		return qtt;
		
    }
}
